package com.gitee.sparta.core.cluster.balance;

/**
 * 负载均衡算法
 *
 * @author zyred
 * @since v 0.0.2
 */
public interface LoadBalance {

    /**
     * 负载均衡, 单线程消费
     *
     * @return      消费的服务节点
     */
    String balance ();

    /**
     * 添加 node 节点， 多线程操作
     *
     * @param isolation     服务隔离
     * @param sid           服务编号
     */
    void addNode (String isolation, Integer sid);

    /**
     * 移除节点，多线程
     *
     * @param sid   服务编号
     */
    void removeNode (Integer sid);

    /**
     * 一次搬运后，搬运到值才进行切换，如果没有搬运到内容，就等到搬运到内容才切换
     */
    void switchover ();

    /**
     * 一次搬运后，搬运的目标消费组进行切换，如果消费者是 leader 本身，那么是否要跳过
     *
     * @param jump      是否跳过 leader 本身 （leader 自己不消费）
     * @param size      leader  所管理的组内有多少个才允许跳，example: size=1,
     *                  如果 leader 的消费组中大于 1 的情况下，leader 就不消费，
     *                  而是由另外一个消费者消费
     */
    void switchover(boolean jump, int size);

    /**
     * 客户端负载的个数
     *
     * @return      >= 1  不可能小于 1
     */
    int size ();


    /**
     * 是否存在 isolation
     *
     * @param isolation     isolation
     * @return              boolean
     */
    boolean contains (String isolation);
}
